﻿using MubiSDK.LoggingLib.Core.Interface;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MubiSDK.LoggingLib.Core.Sinks
{
    /// <summary>
    /// 基于文件大小进行滚动的日志落地模块
    /// </summary>
    /// <remarks>
    /// 该模块不考虑线程安全，线程安全问题由日志器负责
    /// </remarks>
    public class SizeRollingLogSink : ILogSink, IDisposable
    {
        /// <summary>
        /// 
        /// </summary>
        private readonly string _basePath;
        
        /// <summary>
        /// 
        /// </summary>
        private readonly long _maxFileSize;
        
        /// <summary>
        /// 
        /// </summary>
        private StreamWriter _writer = null;
        
        /// <summary>
        /// 
        /// </summary>
        private long _currentSize = 0;
        
        /// <summary>
        /// 
        /// </summary>
        private bool _disposed = false;
        
        public SizeRollingLogSink()
        {
            // 检查传进来的参数是否正确

            // 正确就赋值到成员变量存储起来

            // 创建滚动目录

            // 打开文件
            // - 不存在就创建
            // - 存在就获取其大小设置到成员中
            // - 确定一个滚动文件名构建规则
            // - 编写获取滚动文件名的内部接口

            // 创建文件写入流
        }

        public void Write(string formattedMessage)
        {
            // 先检查是否需要滚动

            // 把日志消息写入磁盘文件
        }

        /// <summary>
        /// 实现IDisposable模式
        /// </summary>
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                if (disposing)
                {
                    // 释放托管资源
                    _writer?.Dispose();
                }
                _disposed = true;
            }
        }

        ~SizeRollingLogSink()
        {
            Dispose(false);
        }
    }
}
